package com.ff.device.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FileUtil {
	private static final Logger LOGGER = LoggerFactory
			.getLogger(FileUtil.class);
	/**
	 * 根据路径删除指定的目录或文件，无论存在与否
	 *
	 * @param sPath
	 *            要删除的目录或文件
	 * @return 删除成功返回 true，否则返回 false。
	 */
	public static boolean deleteFolder(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 判断目录或文件是否存在
		if (!file.exists()) { // 不存在返回 false
			return flag;
		} else {
			// 判断是否为文件
			if (file.isFile()) { // 为文件时调用删除文件方法
				return deleteFile(sPath);
			} else { // 为目录时调用删除目录方法
				return deleteDirectory(sPath);
			}
		}
	}

	/**
	 * 删除目录（文件夹）以及目录下的文件
	 * 
	 * @param sPath
	 *            被删除目录的文件路径
	 * @return 目录删除成功返回true，否则返回false
	 */
	public static boolean deleteDirectory(String sPath) {
		// 如果sPath不以文件分隔符结尾，自动添加文件分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		File dirFile = new File(sPath);
		// 如果dir对应的文件不存在，或者不是一个目录，则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		boolean flag = true;
		// 删除文件夹下的所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		if(files == null){
			return false;
		}
		for (int i = 0; i < files.length; i++) {
			// 删除子文件
			if (files[i].isFile()) {
				flag = deleteFile(files[i].getAbsolutePath());
				if (!flag){
					break;
				}
			}else {// 删除子目录
				flag = deleteDirectory(files[i].getAbsolutePath());
				if (!flag){
					break;
				}
					
			}
		}
		if (!flag){
			return false;
		}
			
		// 删除当前目录
		if (dirFile.delete()) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 删除单个文件
	 * 
	 * @param sPath
	 *            被删除文件的文件名
	 * @return 单个文件删除成功返回true，否则返回false
	 */
	public static boolean deleteFile(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 路径为文件且不为空则进行删除
		if (file.exists() && file.isFile()) {
			boolean result=file.delete();
			if(!result){
				System.out.println("删除文件失败");
			}
			flag = true;
		}
		return flag;
	}

	/**
	 * 复制文件及文件夹
	 * 
	 * @param url
	 * @param deurl
	 * @throws IOException
	 */
	public static void copy(String url, String deurl) {
		try {
			File f = new File(deurl);
			if(!f.exists()){
				boolean result=f.mkdir();
				if(!result){
					System.out.println("创建文件失败");
				}
			}
//			(new File(deurl)).mkdirs();
			// 获取源文件夹当前下的文件或目录
			File[] file = (new File(url)).listFiles();
			if(file == null){
				return;
			}
			for (int i = 0; i < file.length; i++) {
				if (file[i].isFile()) {
					// 复制文件
					copyFile(file[i], new File(deurl +File.separator + file[i].getName()));
				}
				if (file[i].isDirectory()) {
					// 复制目录
					String sorceDir = url + File.separator + file[i].getName();
					String targetDir = deurl + File.separator
							+ file[i].getName();
					copyDirectiory(sorceDir, targetDir);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	/**
	 * 复制文件及文件夹
	 * 
	 * @param url
	 * @param deurl
	 * @throws IOException
	 */
	public static void copyFolder(String url, String deurl) {
		try {
			(new File(deurl)).mkdirs();
			// 获取源文件夹当前下的文件或目录
			File[] file = (new File(url)).listFiles();
			if(file == null){
				return;
			}
			for (int i = 0; i < file.length; i++) {
				if (file[i].isFile()) {
					// 复制文件
					copyFile(file[i], new File(deurl +File.separator + file[i].getName()));
				}
				if (file[i].isDirectory()) {
					// 复制目录
					String sorceDir = url + File.separator + file[i].getName();
					String targetDir = deurl + File.separator
							+ file[i].getName();
					copyDirectiory(sorceDir, targetDir);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * 复制文件
	 * 
	 * @param sourcefile
	 * @param targetFile
	 * @throws IOException
	 */
	public static void copyFile(File sourcefile, File targetFile)
			throws IOException {
		// 新建文件输入流并对它进行缓冲
		FileInputStream input = null;
		BufferedInputStream inbuff = null;

		// 新建文件输出流并对它进行缓冲
		FileOutputStream out = null;
		BufferedOutputStream outbuff = null;

		try {
			// 新建文件输入流并对它进行缓冲
			input = new FileInputStream(sourcefile);
			inbuff = new BufferedInputStream(input);

			// 新建文件输出流并对它进行缓冲
			out = new FileOutputStream(targetFile);
			outbuff = new BufferedOutputStream(out);
			// 缓冲数组
			byte[] b = new byte[1024 * 5];
			int len = 0;
			while ((len = inbuff.read(b)) != -1) {
				outbuff.write(b, 0, len);
			}
			// 刷新此缓冲的输出流
			outbuff.flush();
			outbuff.close();
			out.close();
		} catch (RuntimeException e) {
		    throw e;
		} catch (Exception e) {
			LOGGER.error(e.getMessage());
		} finally{
			// 关闭流
			try {
				if(outbuff!=null){
					outbuff.close();
				}
				if(input!=null){
					input.close();
				}
			}finally {
				if(inbuff!=null){
					inbuff.close();
				}
				if(input!=null){
					input.close();
				}
		   }
		}
	}

	/**
	 * 复制文件夹
	 * 
	 * @param sourceDir
	 * @param targetDir
	 * @throws IOException
	 */
	public static void copyDirectiory(String sourceDir, String targetDir)
			throws IOException {

		// 新建目标目录
//		(new File(targetDir)).mkdirs();
		File f = new File(targetDir);
		if(!f.exists()){
			boolean result=f.mkdirs();
			if(!result){
				System.out.println("创建文件失败");
			}
		}

		// 获取源文件夹当下的文件或目录
		File[] file = (new File(sourceDir)).listFiles();
		if(file == null){
			return;
		}
		for (int i = 0; i < file.length; i++) {
			if (file[i].isFile()) {
				// 源文件
				File sourceFile = file[i];
				// 目标文件
				File targetFile = new File(
						new File(targetDir).getAbsolutePath() + File.separator
								+ file[i].getName());

				copyFile(sourceFile, targetFile);

			}

			if (file[i].isDirectory()) {
				// 准备复制的源文件夹
				String dir1 = sourceDir +File.separator+ file[i].getName();
				// 准备复制的目标文件夹
				String dir2 = targetDir + File.separator + file[i].getName();

				copyDirectiory(dir1, dir2);
			}
		}

	}
}
